home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dmake / var.c < prev    next >
C/C++ Source or Header  |  1997-09-09  |  3KB  |  134 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  VAR.C
  9.  */
  10.  
  11. #include "defs.h"
  12. #ifdef AMIGA
  13. #include <dos/dos.h>
  14. #endif
  15.  
  16. Prototype void InitVar(void);
  17. Prototype Var *MakeVar(char *, char);
  18. Prototype Var *FindVar(char *, char);
  19. Prototype void AppendVar(Var *, char *, long);
  20.  
  21. List VarList;
  22.  
  23. void
  24. InitVar(void)
  25. {
  26.     NewList(&VarList);
  27. }
  28.  
  29. /*
  30.  *  create a variable, deleting any previous contents
  31.  */
  32.  
  33. Var *
  34. MakeVar(char *name, char type)
  35. {
  36.     Var *var;
  37.  
  38.     for (var = GetHead(&VarList); var; var = GetSucc(&var->var_Node)) {
  39.     if ((char)var->var_Node.ln_Type == type && strcmp(var->var_Node.ln_Name, name) == 0) {
  40.         while (PopCmdListChar(&var->var_CmdList) != EOF)
  41.         ;
  42.         return(var);
  43.     }
  44.     }
  45.     var = malloc(sizeof(Var) + strlen(name) + 1);
  46.     clrmem(var, sizeof(Var));
  47.  
  48.     var->var_Node.ln_Name = (char *)(var + 1);
  49.     var->var_Node.ln_Type = type;
  50.     strcpy(var->var_Node.ln_Name, name);
  51.     NewList(&var->var_CmdList);
  52.     AddTail(&VarList, &var->var_Node);
  53.     return(var);
  54. }
  55.  
  56. Var *
  57. FindVar(char *name, char type)
  58. {
  59.     Var *var;
  60.  
  61.     for (var = GetHead(&VarList); var; var = GetSucc(&var->var_Node)) {
  62.     if ((char)var->var_Node.ln_Type == type && strcmp(var->var_Node.ln_Name, name) == 0)
  63.         break;
  64.     }
  65.  
  66.     /*
  67.      *    check for local & env variable(s).  local variables under 2.04
  68.      *    or later only.
  69.      */
  70.  
  71.     if (var == NULL || var->var_Node.ln_Type == '0') {
  72. #ifdef AMIGA
  73.     if (Running2_04()) {
  74.         char *ptr;
  75.         long len;
  76.  
  77.         if (GetVar(name, (char *)&ptr, 2, 0) >= 0) {
  78.         len = IoErr();
  79.         ptr = malloc(len + 1);
  80.         if (GetVar(name, ptr, len + 1, 0) >= 0) {
  81.             var = MakeVar(name, '0');
  82.             AppendVar(var, ptr, strlen(ptr));
  83.         }
  84.         free(ptr);
  85.         }
  86.     } else {
  87.         BPTR lock;
  88.         long fh;
  89.         long size;
  90.  
  91.         if (lock = Lock("ENV:", SHARED_LOCK)) {
  92.         if (fh = Open(name, 1005)) {
  93.             Seek(fh, 0L, 1);
  94.             if ((size = Seek(fh, 0L, -1)) >= 0) {
  95.             char *ptr = malloc(size + 1);
  96.  
  97.             Read(fh, ptr, size);
  98.             ptr[size] = 0;
  99.  
  100.             var = MakeVar(name, '0');
  101.             AppendVar(var, ptr, strlen(ptr));
  102.             free(ptr);
  103.             }
  104.             Close(fh);
  105.         }
  106.         UnLock(lock);
  107.         }
  108.     }
  109. #else
  110.     {
  111.         char *ptr;
  112.  
  113.         if ((ptr = getenv(name)) != NULL) {
  114.         var = MakeVar(name, '0');
  115.         AppendVar(var, ptr, strlen(ptr));
  116.         }
  117.     }
  118. #endif
  119.     }
  120.     return(var);
  121. }
  122.  
  123.  
  124. void
  125. AppendVar(var, buf, len)
  126. Var *var;
  127. char *buf;
  128. long len;
  129. {
  130.     while (len--)
  131.     PutCmdListChar(&var->var_CmdList, *buf++);
  132. }
  133.  
  134.